洛谷题解洛谷题解题解:P10905 [蓝桥杯 2024 省 C] 回文字符串
xyx404
思路:
因为可以添加 l
、q
、b
这三个字符,所以我们可以先把左、右端的这三个字符先拿出来,然后判断一下中间是否回文,如果不回文输出 No
,如果回文再判断一下左,右端拿出来的字符串。
因为只能在开头处加字符,所以当从右端取出来的字符串的字符数量比左端取出来的字符串的字符数量少时,输出 No
,当从右端取出来的字符串的字符数量比左端取出来的字符串的字符数量多时,分别从两个字符串的结尾对比字符,如果字符不一样则输出 No
,因为只能加,不能删。
如果以上都过了,那么就输出 Yes
。
代码:
#include<bits/stdc++.h> using namespace std; #define LL long long #define itn int #define ull unsigned long long string s; int T; int main(){ cin>>T; while(T--){ cin>>s; int flag1=0,flag2=0; int len=s.size();s=" "+s; string c=""; for(int i=1;i<=len;i++){ if(!flag1){ if(s[i]=='l'||s[i]=='q'||s[i]=='b')c+=s[i]; else{ flag1=i;break; } } } string d=""; for(int i=len;i>=1;i--){ if(!flag2){ if(s[i]=='l'||s[i]=='q'||s[i]=='b')d+=s[i]; else{ flag2=i;break; } } } bool bj=0; for(int i=d.size()-1,j=c.size()-1;i>=0&&j>=0;i--,j--){ if(d[i]!=c[j]){ bj=1;break; } } if(bj||d.size()<c.size()){ cout<<"No\n";continue; } c="",d=""; for(int i=flag1,j=flag2;i<=j;i++,j--){ c+=s[i];d+=s[j]; } if(c==d)cout<<"Yes\n"; else cout<<"No\n"; } return 0; }
|